//
//  ViewController.m
//  UI25-多线程
//
//  Created by dllo on 16/8/17.
//  Copyright © 2016年 DM.C. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // iOS下的多线程
    // 1.进程和线程
    // 什么是进程? 进程是当用户下达执行应用程序的命令时, 所启动的东西, 进程比作工厂
    // 什么是线程? 线程是进程的执行单位, 把线程比作工人
    // 2.多线程
    // 为了更好的进行一些程序的操作, 节省时间, 提高效率
    // 一个进程不能过多的创建线程, 资源消耗过大.(工厂不能有太多的工人, 工资发不起), 开辟五个左右的线程
    // 注意: 所有UI的操作都放在主线程中进行
    // 需要开辟线程的耗时操作 : 图像文字渲染, 大数据存储, 网络请求等等.
    // 3.NSThread
    // 1> currentThread 获取当前线程
    // 获取到当前线程  <NSThread: 0x60800007d300>{number = 1, name = main}
    // name 线程名  number 线程编号
    // main 代表主线程
    NSThread *thread = [NSThread currentThread];
    NSLog(@"%@", thread);
    // 2> 开辟子线程执行操作
    //    子线程随机创建
    [NSThread detachNewThreadSelector:@selector(newThread) toTarget:self withObject:nil];
    [NSThread detachNewThreadWithBlock:^{
        NSThread *thread = [NSThread currentThread];
        NSLog(@"newThread %@", thread);
    }];
    // 3> 延迟当前线程的执行(比如5秒), 固定时间
//    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:5];
//    [NSThread sleepUntilDate:date];
//    NSLog(@"11111");
    // 4> 相对时间
//    [NSThread sleepForTimeInterval:8];
//    NSLog(@"21215215");
    // 5> exit 退出当前线程, 不要退出主线程, 退出后线程后续操作不会再执行
//    [NSThread exit];
//    NSLog(@"%@", [NSThread mainThread]);
    // 6> threadPriority (用来改变/查看优先级)
    //    默认的优先级都是0.5
    double preiority = [NSThread threadPriority];
    NSLog(@"double: %lf", preiority);
    // 7> name 线程名
    [NSThread mainThread].name = @"xxx的主线程";
    NSLog(@"%@", thread);
    // 8> isMainThread 判断是否是主线程
    //    判断当前线程是不是主线程
    [NSThread isMainThread];
    //    判断线程对象是不是主线程
    [[NSThread mainThread] isMainThread];
    // 9> 初始化方法, 需要手动管理线程的生命周期
    // 初始化一个未启动的线程
    NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThread) object:nil];
    [newThread start];
    
    // 在主线程中下载图片
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    self.imageView2.image = [UIImage imageWithData:imageData];

    // 练习1(开辟一个新线程下载图片)
    NSThread *preojectThread = [[NSThread alloc] initWithTarget:self selector:@selector(projectThread) object:nil];
    [preojectThread start];
    
    // 练习2: 下载图片
    // 10> 将耗时的操作, 放入到后台执行
    // 不关心线程问题
    [self performSelectorInBackground:@selector(projectThread) withObject:nil];
    // 11>performSelectorOnMainThread 返回主线程执行操作
    
    
    
}
- (void)projectThread {
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lingyu.me/wp-content/uploads/2016/08/www.lingyu.me_20160808081654350.jpg"]];
    // 返回主线程, 显示图片
    [self performSelectorOnMainThread:@selector(onMainThreadHandleImage:) withObject:imageData waitUntilDone:YES];
//    self.imageView.image = [UIImage imageWithData:imageData];
}

- (void)onMainThreadHandleImage:(id)objc {
    _imageView.image = [UIImage imageWithData:objc];
}
- (void)myThread{
    // 循环1000次 ,当第1000次的时候退出这个线程
  //    for (int i = 0; i < 1000; i++) {
//        NSLog(@"%d", i);
//        if (i == 999) {
//            [NSThread exit];
//        }
//    }
    NSLog(@"%s", __FUNCTION__);
}
- (void)newThread {
    
    double preiority = [NSThread threadPriority];
    NSLog(@"double: %lf", preiority);
    NSThread *thread = [NSThread currentThread];
    thread.name = @"xxx的线程";
    NSLog(@"newThread**** %@", thread);

}
- (IBAction)clickGCDButton:(id)sender {
    for (int i = 0; i < 100000000; i++) {
        NSLog(@"第%d次", i);
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
